package com.hgl.bi.web.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hgl.bi.common.constant.ErrorCode;
import com.hgl.bi.common.manager.RedisManager;
import com.hgl.bi.common.model.dto.PageDTO;
import com.hgl.bi.common.model.vo.R;
import com.hgl.bi.common.utils.AssertUtil;
import com.hgl.bi.common.utils.ConvertUtil;
import com.hgl.bi.web.entity.TagEntity;
import com.hgl.bi.web.entity.UserEntity;
import com.hgl.bi.web.model.dto.TagSaveDto;
import com.hgl.bi.web.model.dto.UserInfoDto;
import com.hgl.bi.web.model.vo.TagVo;
import com.hgl.bi.web.service.TagService;
import com.hgl.bi.web.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @program: BI
 * @description: 数据标签控制器
 * @author: hgl
 * @create: 2025-02-28 13:59
 */
@Tag(name = "标签管理模块")
@RestController
public class TagController {

    @Autowired
    private RedisManager redisManager;

    @Autowired
    private TagService tagService;

    @Autowired
    private UserService userService;

    /**
     * 查询标签统计
     *
     * @return 标签统计
     * @author hgl
     */
    @Operation(summary = "查询标签统计", tags = "标签管理模块")
    @GetMapping("/tag/stats")
    public R<List<TagVo>> getTagStats() {
        List<TagVo> tagStats = tagService.getTagStats();
        return R.success(tagStats);
    }

    /**
     * 查询所有标签
     *
     * @return 标签列表
     * @author hgl
     */
    @Operation(summary = "查询所有标签", tags = "标签管理模块")
    @GetMapping("/tag/list/all")
    public R<List<TagEntity>> getAllTags() {
        List<TagEntity> tags = tagService.list();
        return R.success(tags);
    }

    /**
     * 分页查询标签列表
     *
     * @param pageDto 分页信息
     * @return 标签分页信息
     * @author hgl
     */
    @Operation(summary = "查询标签列表", tags = "标签管理模块")
    @GetMapping("/tag/list")
    public R<Page<TagEntity>> listTags(@ParameterObject PageDTO pageDto) {
        // 非空校验
        AssertUtil.notNull(pageDto, ErrorCode.REQUEST_PARAM_ERROR);
        // 分页查询
        Page<TagEntity> page = new Page<>(pageDto.getPage(), pageDto.getSize());
        QueryWrapper<TagEntity> wrapper = new QueryWrapper<>();
        if (pageDto.getKeyword() != null && !pageDto.getKeyword().isEmpty()) wrapper
                .like("tag_name", pageDto.getKeyword());
        Page<TagEntity> tagPage = tagService.page(page, wrapper);
        List<UserEntity> list = userService.list();
        for (TagEntity tag : tagPage.getRecords()) {
            for (UserEntity user : list) {
                if (tag.getUserId().equals(user.getId())) {
                    tag.setUsername(user.getUsername());
                }
            }
        }
        return R.success(tagPage);
    }

    /**
     * 更新标签信息
     *
     * @param tag 标签信息
     * @return R<String>
     * @author hgl
     */
    @Operation(summary = "更新标签信息", tags = "标签管理模块")
    @PostMapping("/tag/update")
    public R<String> updateTagInfo(@RequestBody TagEntity tag) {
        // 非空校验
        AssertUtil.notNull(tag, ErrorCode.REQUEST_PARAM_ERROR);
        // 更新标签
        UpdateWrapper<TagEntity> wrapper = new UpdateWrapper<TagEntity>()
                .eq("id", tag.getId())
                .set("tag_name", tag.getTagName());
        boolean updated = tagService.update(wrapper);
        AssertUtil.isTrue(updated, ErrorCode.UPDATE_FALSE);
        return R.ok("更新成功");
    }

    /**
     * 保存标签信息
     *
     * @param tag 标签信息
     * @return R<String>
     * @author hgl
     */
    @Operation(summary = "保存标签信息", tags = "标签管理模块")
    @PutMapping("/tag/save")
    public R<String> saveTagInfo(@RequestHeader("satoken") String satoken,
                                 @RequestBody TagSaveDto tag) {
        // 非空校验
        AssertUtil.notNull(tag, ErrorCode.REQUEST_PARAM_ERROR);
        // 保存标签
        TagEntity tagEntity = ConvertUtil.convertObject(tag, TagEntity.class, null);
        UserInfoDto userInfo = (UserInfoDto) redisManager
                .get("satoken:" + satoken, UserInfoDto.class);
        long id = userInfo.getId();
        tagEntity.setUserId(id);
        boolean saved = tagService.save(tagEntity);
        AssertUtil.isTrue(saved, ErrorCode.SAVE_FALSE);
        return R.ok("保存成功");
    }

    /**
     * 删除标签信息
     *
     * @param id 标签ID
     * @return R<String>
     * @author hgl
     */
    @Operation(summary = "删除标签信息", tags = "标签管理模块")
    @DeleteMapping("/tag/remove/{id}")
    public R<String> removeTagInfo(@PathVariable Long id) {
        // 非空校验
        AssertUtil.notNull(id, ErrorCode.REQUEST_PARAM_ERROR);
        // 删除用户
        boolean removed = tagService.removeById(id);
        AssertUtil.isTrue(removed, ErrorCode.REMOVE_FALSE);
        return R.ok("删除成功");
    }
}
